home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 031-040 / amok38 / hyperkubus / hyperkubus.mod < prev    next >
Encoding:
Text File  |  1993-11-04  |  14.3 KB  |  533 lines

  1. (*
  2. __________________________________________________________________________
  3.  
  4.   :Program.       HyperKubus.mod
  5.   :Contents.      Zeigt einen vierdimensionalen Würfel, der mit der
  6.   :Contents.      Maus in allen vier Dimensionen rotiert werden kann.
  7.   :Contents.      Schwarz-weiß oder anaglyph (mit Rot-Grün-Brille).
  8.   :Author.        Franz Dimbeck
  9.   :Address.       Troppauerstraße 48, D-8058 Erding.
  10.   :Phone.         08122 18135
  11.   :Copyright.     Public Domain
  12.   :Language.      Modula-2
  13.   :Translator.    M2-Amiga V3.3d
  14.   :History.       V1.0 16-Apr-90
  15.   :Support.       Nach einem Artikel von Alexander Keewatin Dewdney
  16.   :Support.       in Spektrum der Wissenschaft, Computer-Kurzweil 1987.
  17.   :Remark.        Wer sich zu lange mit dem Programm beschäftigt,
  18.   :Remark.        verschwindet in der vierten Dimension.
  19.  
  20. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  21. *)
  22.  
  23. MODULE HyperKubus;    (* $R- $V- $S- $F- $L- *)
  24.  
  25.  
  26. FROM Arts       IMPORT AllLevelTermProc,Assert;
  27.  
  28. FROM GfxMacros  IMPORT SetWrMsk;
  29.  
  30. FROM Graphics   IMPORT Draw,Move,RastPortPtr,RectFill,SetAPen,SetRGB4,
  31.                        Text,ViewModeSet,ViewPortPtr;
  32.  
  33. FROM Intuition  IMPORT CloseScreen,CloseWindow,customScreen,
  34.                        IDCMPFlagSet,NewScreen,NewWindow,OpenScreen,
  35.                        OpenWindow,ScreenPtr,ScreenToFront,ShowTitle,
  36.                        WindowFlags,WindowFlagSet,WindowPtr;
  37.  
  38. FROM MathLibFFP IMPORT sin,cos,pi;
  39.  
  40. FROM SYSTEM     IMPORT ADR ,FFP;
  41.  
  42. CONST
  43.   EckZ    = 15;   (* Der HyperKubus hat 16 Ecken [0..15] *)
  44.   Licht   = 300.0;  (* Abstand in Z-Richtung des
  45.                      Brennpunkts für Zentralprojektion *)
  46.   Winkel  = 3;    (* Unter diesem Winkel (in Grad) treffen sich die
  47.                      Sehstrahlen der Augen auf dem HyperKubus - für
  48.                      die anaglyphe Darstellung *)
  49. TYPE
  50.   Hyper    = ARRAY [0..15] OF ARRAY [0..3] OF FFP;
  51.             (* Enthält die 4 Koordinaten der 16 Eckpunkte *)
  52.  
  53.   Vmod     = (mono,anaglyph3D,anaglyph4D);
  54.             (* Darstellungsarten *)
  55. VAR
  56.   Ecke,
  57.   Temp         :Hyper;
  58.   Darstellung  :Vmod;
  59.   Punkte       :ARRAY [0..15] OF ARRAY[0..1] OF INTEGER;
  60.   Pfad         :ARRAY[0..32] OF INTEGER;
  61.   i,j,xo,yo,
  62.   Wahl,AWahl,
  63.   xa,xt,ya     :LONGINT;
  64.   Sn           :[0..1];
  65.   NewWin       :ARRAY [0..1] OF  NewWindow;
  66.   NewScr       :ARRAY [0..1] OF  NewScreen;
  67.   MyWindow     :ARRAY [0..1] OF  WindowPtr;
  68.   MyScreen     :ARRAY [0..1] OF  ScreenPtr;
  69.   MyRast       :ARRAY [0..1] OF  RastPortPtr;
  70.   MyView       :ARRAY [0..1] OF  ViewPortPtr;
  71.   ok,auto,
  72.   quit,neg     :BOOLEAN;
  73.   Taste        :CHAR;
  74.   Txt,ATxt     :ARRAY [0..5] OF ARRAY [0..5] OF CHAR;
  75.   Ciapra [0BFE001H]: SET OF (s0,s1,s2,s3,s4,s5,lmb); (* für Mausknopf *)
  76.  
  77.  
  78.  
  79. PROCEDURE MyScreenWindow;
  80. (* zwei Screens für double-buffering *)
  81. VAR i :[0..1]  ;
  82. BEGIN
  83.   FOR i := 0 TO 1 DO;
  84.     MyScreen[i] := NIL;
  85.     WITH NewScr[i] DO
  86.       width        :=320;
  87.       leftEdge     :=0;
  88.       topEdge      :=0;
  89.       height       :=256;
  90.       depth        :=2;
  91.       detailPen    :=0;
  92.       blockPen     :=0;
  93.       viewModes    :=ViewModeSet{};
  94.       type         :=customScreen;
  95.       font         :=NIL;
  96.       defaultTitle :=NIL;
  97.       gadgets      :=NIL;
  98.       customBitMap :=NIL;
  99.     END;
  100.     MyScreen[i] := OpenScreen(NewScr[i]);
  101.     Assert(MyScreen[i]<>NIL,ADR("Konnte Plot3-Screen nicht öffnen"));
  102.     ShowTitle(MyScreen[i],FALSE);
  103.     MyView[i] := ADR(MyScreen[i]^.viewPort);
  104.     SetRGB4(MyView[i],0,0,0,0);
  105.     SetRGB4(MyView[i],1,0,15,15);
  106.     SetRGB4(MyView[i],2,15,0,15);
  107.     SetRGB4(MyView[i],3,0,0,0);
  108.     MyWindow[i] := NIL;
  109.     WITH NewWin[i] DO
  110.       leftEdge    :=0;
  111.       topEdge     :=0;
  112.       width       :=320;
  113.       height      :=256;
  114.       detailPen   :=0;
  115.       blockPen    :=0;
  116.       idcmpFlags  :=IDCMPFlagSet{};
  117.       flags       :=WindowFlagSet {backDrop,
  118.                                   borderless,
  119.                                   activate,
  120.                                   noCareRefresh};
  121.       title       :=NIL;
  122.       type        :=customScreen;
  123.       firstGadget :=NIL;
  124.       checkMark   :=NIL;
  125.       screen      :=MyScreen[i];
  126.       bitMap      :=NIL;
  127.     END;
  128.     MyWindow[i] := OpenWindow(NewWin[i]);
  129.     Assert(MyWindow[i]<>NIL,ADR("konnte Fenster nicht öffnen"));
  130.     MyRast[i] := MyWindow[i]^.rPort;
  131.     SetAPen(MyRast[i],3);
  132.   END;
  133. END MyScreenWindow;
  134.  
  135. PROCEDURE Cleanup;
  136. VAR i :[0..1];
  137. BEGIN
  138.   FOR i := 0 TO 1 DO
  139.     IF MyWindow[i]#NIL THEN
  140.       CloseWindow(MyWindow[i]);
  141.     END;
  142.     IF MyScreen[i]#NIL THEN
  143.       CloseScreen(MyScreen[i]);
  144.     END;
  145.   END;
  146. END Cleanup;
  147.  
  148. PROCEDURE InitPfad;
  149. (* Reihenfolge der Ecken zum Zeichnen der Kanten *)
  150. BEGIN
  151.   Pfad[0]  := 0;  Pfad[1]  := 1;  Pfad[2]  := 3;  Pfad[3]  := 2;
  152.   Pfad[4]  := 6;  Pfad[5]  := 14; Pfad[6]  := 10; Pfad[7]  := 8;
  153.   Pfad[8]  := 9;  Pfad[9]  := 11; Pfad[10] := 3;  Pfad[11] := 7;
  154.   Pfad[12] := 15; Pfad[13] := 14; Pfad[14] := 12; Pfad[15] := 13;
  155.   Pfad[16] := 9;  Pfad[17] := 1;  Pfad[18] := 5;  Pfad[19] := 7;
  156.   Pfad[20] := 6;  Pfad[21] := 4;  Pfad[22] := 12; Pfad[23] := 8;
  157.   Pfad[24] := 0;  Pfad[25] := 4;  Pfad[26] := 5;  Pfad[27] := 13;
  158.   Pfad[28] := 15; Pfad[29] := 11; Pfad[30] := 10; Pfad[31] := 2;
  159.   Pfad[32] := 0;
  160. END InitPfad;
  161.  
  162. PROCEDURE InitEcke;
  163. (* Initialiseren der Koordinaten des nicht gedrehten HyperKubus *)
  164. VAR
  165.   i,x,y,z,w :INTEGER;
  166. BEGIN
  167.   i := -1;
  168.   FOR x := 0 TO 1 DO
  169.     FOR y := 0 TO 1 DO
  170.       FOR z := 0 TO 1 DO
  171.         FOR w := 0 TO 1 DO;
  172.           INC(i);
  173.           Ecke[i,0] := FFP(w*100-50);
  174.           Ecke[i,1] := FFP(z*100-50);
  175.           Ecke[i,2] := FFP(y*100-50);
  176.           Ecke[i,3] := FFP(x*100-50);
  177.         END;
  178.       END;
  179.     END;
  180.   END;
  181. END InitEcke;
  182.  
  183.  
  184. (* R O T A T I O N:
  185.    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  186.    Die folgenden sechs Prozeduren drehen den HyperKubus in den
  187.    sechs möglichen Richtungen. Im vierdimensionalen Raum kann eine
  188.    Drehung nicht durch eine Drehachse angegeben werden, da es ja
  189.    zu jeder Ebene zwei verschiedene Richtungen gibt, die auf ihr
  190.    senkrecht stehen. Es muß daher die Drehebene angegeben werden.
  191.    Die Prozedur "Rot12" rotiert den HyperKubus also in der Ebene,
  192.    die von den Koordinatenachsen 1 und 2 gebildet werden, d.h. in
  193.    der x/y-Ebene.
  194.     "d"    gibt den Rotationswinkel in Grad an,
  195.     "alt"  ist die Matrix mit den zu rotierende Koordinaten
  196.            das Ergebnis wird in der Matrix Temp abgespeichert.
  197. *)
  198.  
  199. PROCEDURE Rot12( d:INTEGER; VAR alt :Hyper);
  200. VAR
  201.   a1,a2,s,c,w:FFP;
  202.   i     :INTEGER;
  203. BEGIN
  204.   w := FFP(d)/180.0*pi;
  205.   s := sin(w);
  206.   c := cos(w);
  207.   FOR i := 0 TO 15 DO
  208.     Temp[i,2] := alt[i,2];
  209.     Temp[i,3] := alt[i,2];
  210.     a1 := alt[i,0];
  211.     a2 := alt[i,1];
  212.     Temp[i,0] := a1*c - a2*s;
  213.     Temp[i,1] := a1*s + a2*c;
  214.   END;
  215. END Rot12;
  216.  
  217. PROCEDURE Rot13( d:INTEGER; VAR alt:Hyper);
  218. VAR
  219.   a1,a3,s,c,w:FFP;
  220.   i     :INTEGER;
  221. BEGIN
  222.   w := FFP(d)/180.0*pi;
  223.   s := sin(w);
  224.   c := cos(w);
  225.   FOR i := 0 TO 15 DO
  226.     Temp[i,1] := alt[i,1];
  227.     Temp[i,3] := alt[i,3];
  228.     a1 := alt[i,0];
  229.     a3 := alt[i,2];
  230.     Temp[i,0] := a1*c - a3*s;
  231.     Temp[i,2] := a1*s + a3*c;
  232.   END;
  233. END Rot13;
  234.  
  235. PROCEDURE Rot23( d:INTEGER; VAR alt:Hyper);
  236. VAR
  237.   a2,a3,s,c,w:FFP;
  238.   i     :INTEGER;
  239. BEGIN
  240.   w := FFP(d)/180.0*pi;
  241.   s := sin(w);
  242.   c := cos(w);
  243.   FOR i := 0 TO 15 DO
  244.     Temp[i,0] := alt[i,0];
  245.     Temp[i,3] := alt[i,3];
  246.     a2 := alt[i,1];
  247.     a3 := alt[i,2];
  248.     Temp[i,1] := a2*c - a3*s;
  249.     Temp[i,2] := a2*s + a3*c;
  250.   END;
  251. END Rot23;
  252.  
  253. PROCEDURE Rot14( d:INTEGER; VAR alt:Hyper);
  254. VAR
  255.   a1,a4,s,c,w:FFP;
  256.   i     :INTEGER;
  257. BEGIN
  258.   w := FFP(d)/180.0*pi;
  259.   s := sin(w);
  260.   c := cos(w);
  261.   FOR i := 0 TO 15 DO
  262.     Temp[i,1] := alt[i,1];
  263.     Temp[i,2] := alt[i,2];
  264.     a1 := alt[i,0];
  265.     a4 := alt[i,3];
  266.     Temp[i,0] := a1*c - a4*s;
  267.     Temp[i,3] := a1*s + a4*c;
  268.   END;
  269. END Rot14;
  270.  
  271. PROCEDURE Rot24( d:INTEGER; VAR alt:Hyper);
  272. VAR
  273.   a2,a4,s,c,w:FFP;
  274.   i     :INTEGER;
  275. BEGIN
  276.   w := FFP(d)/180.0*pi;
  277.   s := sin(w);
  278.   c := cos(w);
  279.   FOR i := 0 TO 15 DO
  280.     Temp[i,0] := alt[i,0];
  281.     Temp[i,2] := alt[i,2];
  282.     a2 := alt[i,1];
  283.     a4 := alt[i,3];
  284.     Temp[i,1] := a2*c - a4*s;
  285.     Temp[i,3] := a2*s + a4*c;
  286.   END;
  287. END Rot24;
  288.  
  289. PROCEDURE Rot34( d:INTEGER; VAR alt:Hyper);
  290. VAR
  291.   a3,a4,s,c,w:FFP;
  292.   i     :INTEGER;
  293. BEGIN
  294.   w := FFP(d)/180.0*pi;
  295.   s := sin(w);
  296.   c := cos(w);
  297.   FOR i := 0 TO 15 DO
  298.     Temp[i,0] := alt[i,0];
  299.     Temp[i,1] := alt[i,1];
  300.     a3 := alt[i,2];
  301.     a4 := alt[i,3];
  302.     Temp[i,2] := a3*c - a4*s;
  303.     Temp[i,3] := a3*s + a4*c;
  304.   END;
  305.  
  306. END Rot34;
  307. (*------------- Ende der Rotationsprozeduren --------------------*)
  308.  
  309.  
  310. (* Die Prozedur "Calc" berechnet die Zentralprojektion in z-Richtung.
  311.    Das Ergebnis wird in der Matrix "Punkte" abgelegt.
  312. *)
  313. PROCEDURE Calc;
  314. VAR
  315.   i : INTEGER;
  316. BEGIN
  317.   FOR i := 0 TO 15 DO;
  318.     Punkte[i,0] := 160+INTEGER((Temp[i,0]*Licht)/(Licht-Temp[i,2]));
  319.     Punkte[i,1] := 105+INTEGER((Temp[i,1]*Licht)/(Licht-Temp[i,2]));
  320.   END;
  321. END Calc;
  322.  
  323. PROCEDURE Zeichne;
  324. VAR
  325.   i : INTEGER;
  326.   R : [0..1];
  327. BEGIN
  328.   R := 1-Sn;
  329.   SetAPen (MyRast[R],0);
  330.   RectFill(MyRast[R],41,0,279,213);
  331.   SetAPen (MyRast[R],3);
  332.   IF Darstellung#mono THEN
  333.     SetWrMsk(MyRast[1-Sn],1);
  334.   END;
  335.   Calc;
  336.   Move(MyRast[R],Punkte[0,0],Punkte[0,1]);
  337.   FOR i := 1 TO 32 DO;
  338.     Draw(MyRast[R],Punkte[Pfad[i],0],Punkte[Pfad[i],1]);
  339.   END;
  340.   IF (Darstellung#mono) THEN
  341.     SetWrMsk(MyRast[1-Sn],2);
  342.     IF (Darstellung=anaglyph3D) THEN
  343.       Rot13(Winkel,Temp);
  344.     ELSE    (* Darstellung=anaglyph4D *)
  345.       Rot14(Winkel,Temp);
  346.     END;
  347.     Calc;
  348.     Move(MyRast[R],Punkte[0,0],Punkte[0,1]);
  349.     FOR i := 1 TO 32 DO;
  350.       Draw(MyRast[R],Punkte[Pfad[i],0],Punkte[Pfad[i],1]);
  351.     END;
  352.   END;
  353.   SetWrMsk(MyRast[1-Sn],3);
  354. END Zeichne;
  355.  
  356. PROCEDURE Kasten (h,v : INTEGER; an:BOOLEAN);
  357. VAR R : [0..1];
  358. BEGIN
  359.   v := v*20;
  360.   FOR R := 0 TO 1 DO;
  361.     SetWrMsk(MyRast[R],3);
  362.     IF an THEN
  363.       SetAPen(MyRast[R],3);
  364.     ELSE
  365.       SetAPen(MyRast[R],0);
  366.     END;
  367.     Move(MyRast[R],h*53+3,217+v);
  368.     Draw(MyRast[R],h*53+50,217+v);Draw(MyRast[R],h*53+50,233+v);
  369.     Draw(MyRast[R],h*53+3,233+v);Draw(MyRast[R],h*53+3,217+v);
  370.     Move(MyRast[R],h*53+4,218+v);
  371.     Draw(MyRast[R],h*53+49,218+v);Draw(MyRast[R],h*53+49,232+v);
  372.     Draw(MyRast[R],h*53+4,232+v);Draw(MyRast[R],h*53+4,218+v);
  373.   END;
  374. END Kasten;
  375.  
  376. PROCEDURE Auswahl;
  377. VAR
  378.   R : [0..1];
  379.   Select : INTEGER;
  380. BEGIN
  381.   Select := xo/53;
  382.   IF (Select>5) THEN Select := 5 END;
  383.   IF yo > 235 THEN
  384.   i := -2; j := -3;
  385.     Wahl := Select;
  386.     Kasten(AWahl,1,FALSE);
  387.     Kasten(Wahl,1,TRUE);
  388.     AWahl := Wahl;
  389.   ELSE
  390.     CASE Select OF
  391.     | 0..2 :Kasten(ORD(Darstellung),0,FALSE);
  392.             Kasten(Select,0,TRUE);
  393.             Darstellung := VAL(Vmod,Select);
  394.     | 3    :neg := NOT neg;
  395.             Kasten(3,0,neg);
  396.             FOR R := 0 TO 1 DO
  397.               IF neg THEN
  398.                 SetRGB4(MyView[R],0,0,0,0);
  399.                 SetRGB4(MyView[R],1,15,0,0);
  400.                 SetRGB4(MyView[R],2,0,15,0);
  401.                 SetRGB4(MyView[R],3,15,15,0);
  402.               ELSE
  403.                 SetRGB4(MyView[R],0,15,15,15);
  404.                 SetRGB4(MyView[R],1,0,15,15);
  405.                 SetRGB4(MyView[R],2,15,0,15);
  406.                 SetRGB4(MyView[R],3,0,0,5);
  407.               END;
  408.             END;
  409.     | 4    :auto := NOT auto;
  410.             Kasten(4,0,auto);
  411.     | 5    :quit := TRUE;
  412.             Kasten(5,0,quit);
  413.     END; (* CASE Select OF *)
  414.   END; (* IF yo > 235 THEN ELSE *)
  415.   WHILE NOT(lmb IN Ciapra) DO ; END;
  416. END Auswahl;
  417.  
  418. PROCEDURE Titel;
  419. BEGIN
  420.   SetAPen(MyRast[1],3);
  421.   RectFill(MyRast[1],41,8,273,82);
  422.   SetAPen(MyRast[1],0);
  423.   RectFill(MyRast[1],43,10,271,80);
  424.   Move(MyRast[1],80,38);
  425.   SetAPen(MyRast[1],3);
  426.   Text(MyRast[1],ADR("H Y P E R K U B U S"),19);
  427.   Move(MyRast[1],48,62);
  428.   Text(MyRast[1],ADR("Ein Würfel in 4 Dimensionen"),27);
  429.   Move(MyRast[1],56,120);
  430.   Text(MyRast[1],ADR("Mausbewegungen drehen den"),25);
  431.   Move(MyRast[1],80,130);
  432.   Text(MyRast[1],ADR("Würfel im 3-D Raum."),19);
  433.   Move(MyRast[1],48,150);
  434.   Text(MyRast[1],ADR("Die linke Maustaste rotiert"),27);
  435.   Move(MyRast[1],68,160);
  436.   Text(MyRast[1],ADR("den Würfel auch in die"),22);
  437.   Move(MyRast[1],88,170);
  438.   Text(MyRast[1],ADR("vierte Dimension."),17);
  439.   SetRGB4(MyView[0],0,15,15,15);
  440.   SetRGB4(MyView[1],0,15,15,15);
  441. END Titel;
  442.  
  443. PROCEDURE Init;
  444. BEGIN
  445.   MyScreenWindow;
  446.   AllLevelTermProc(Cleanup);
  447.   InitPfad;
  448.   InitEcke;
  449.   Titel;
  450.   Sn := 0;
  451.   Txt[0] := "ROT14";Txt[1] := "ROT24";Txt[2] := "ROT34";
  452.   Txt[3] := "14R24";Txt[4] := "14R34";Txt[5] := "24R34";
  453.   ATxt[0] := " 2-D ";ATxt[1] := " 3-D ";ATxt[2] := " 4-D ";
  454.   ATxt[3] := " NEG ";ATxt[4] := "AUTO ";ATxt[5] := "QUIT!";
  455.   FOR i := 0 TO 1 DO
  456.     SetAPen(MyRast[i],3);
  457.     Move(MyRast[i],0,215);
  458.     Draw(MyRast[i],319,215);Draw(MyRast[i],319,255);
  459.     Draw(MyRast[i],0,255);Draw(MyRast[i],0,215);
  460.     Move(MyRast[i],0,235);Draw(MyRast[i],319,235);
  461.     FOR j := 0 TO 5 DO
  462.       Move(MyRast[i],j*53,215);Draw(MyRast[i],j*53,255);
  463.       Move(MyRast[i],j*53+7,248);Text(MyRast[i],ADR(Txt[j]),5);
  464.       Move(MyRast[i],j*53+7,228);Text(MyRast[i],ADR(ATxt[j]),5);
  465.     END;
  466.   END;
  467.   Sn := 0;
  468.   auto := FALSE; neg := FALSE;
  469.   xo := 120 ; yo := 240; Auswahl;
  470.   xo := 60;   yo := 230; Auswahl;
  471.   i := 0; j := 0; xt := 0;
  472.   xo := MyWindow[Sn]^.mouseX; yo := MyWindow[Sn]^.mouseY;
  473. END Init;
  474.  
  475.  
  476. BEGIN   (* Hauptprogramm *)
  477.   Init;
  478.   WHILE NOT quit DO
  479.     IF ((xo#MyWindow[Sn]^.mouseX)
  480.     OR (yo#MyWindow[Sn]^.mouseY))
  481.     OR NOT(lmb IN Ciapra)
  482.     OR auto THEN
  483.       ScreenToFront(MyScreen[Sn]);
  484.       xo := MyWindow[Sn]^.mouseX;
  485.       yo := MyWindow[Sn]^.mouseY;
  486.       IF (auto OR (NOT (lmb IN Ciapra))) THEN
  487.         IF (yo>215) AND NOT(lmb IN Ciapra) THEN
  488.           Auswahl;
  489.         END;
  490.         INC(i,2);        INC(j,3);
  491.         i := i MOD 360;  j := j MOD 360;
  492.       END;
  493.       ya := yo;
  494.       IF yo>214 THEN
  495.         ya := 214; xa := xt;
  496.       ELSE
  497.         xa := xo; xt := xo;
  498.       END;
  499.       ya := ya*360/214; xa :=xa*360/320;
  500.       Rot23(ya,Ecke); (* Rotation um die x-Achse, 4.Dimens unveränd.*)
  501.       CASE Wahl OF
  502.         | 0 : Rot14(j,Temp);                     (* Rotationen  *)
  503.         | 1 : Rot24(j,Temp);                     (*    mit      *)
  504.         | 2 : Rot34(j,Temp);                     (* Veränderung *)
  505.         | 3 : Rot14(j,Temp);Rot24(i,Temp);  (*    der      *)
  506.         | 4 : Rot14(j,Temp);Rot34(i,Temp);  (*   vierten   *)
  507.         | 5 : Rot24(j,Temp);Rot34(i,Temp);  (*  Dimension  *)
  508.       END;
  509.       Rot13(xa,Temp); (* Rotation um die y-Achse, 4.Dimens unveränd.*)
  510.       Zeichne;
  511.       Sn := 1-Sn;
  512.     END;  (* IF *)
  513.   END;  (* WHILE NOT quit *)
  514.  
  515.  
  516.   (* End-Sequenz *)
  517.   FOR i := 0 TO 33 DO
  518.     ScreenToFront(MyScreen[Sn]);
  519.     FOR j := 0 TO 15 DO
  520.       FOR xo := 0 TO 3 DO
  521.         Temp[j,xo] :=Temp[j,xo]*0.9;
  522.       END;
  523.     END;
  524.     Rot13(4,Temp);
  525.     Rot23(3,Temp);
  526.     Rot34(4,Temp);
  527.     Zeichne;
  528.     Sn := 1-Sn;
  529.   END;
  530. END HyperKubus.
  531.  
  532.  
  533.